package io;

import org.junit.Test;

import javax.swing.*;
import java.io.File;
import java.io.IOException;

/**
 * IO：  传输数据      C/S 聊天室 Version
 * API上部分：字符串、包装类、日期类、集合
 * --------电脑有三大件：cpu  硬盘  内存
 * API下部分：IO流  ----硬盘----文件数据传输
 *
 * 包位置：java.io
 * File文件、文件夹类
 * 作用：用于表示操作系统中的一个文件或者“目录：文件夹”
 * 创建File对象--->有参对象--->“路径+文件/文件夹全称”
 *
 * File类方法使用：
 * 1.查看该文件或者“文件夹：目录”的属性信息(名字、大小、是否存在)
 * 2.操作文件或者“文件夹：目录”(创建、删除)
 * 3.访问一个“文件夹：目录”的子项
 */
public class FileAPI {
    @Test
    public void testFile() {
        //创建文件类
        //需求：当前API下创建文件----手动创建
        //File file=
        //new File("D:\\java-api\\API\\src\\main\\java\\com\\tedu\\api\\io\\demo.txt");
        //相对路径----当前API下创建文件！  项目：Maven结构 main编写代码
        //FileAPI.java 相对于    API项目下-->从src开始
        //操作系统：路径  \ 代表路径   文件上传至服务器     √
        //             / 代表路今后  文件下载到本地
        // Java任何平台【操作系统】运行   统一路径属性
        //File.separator  静态属性：任何操作系统下转换成正确的路径表示方式
        File file = new File("src" + File.separator +
                "main" + File.separator +
                "java" + File.separator +
                "com" + File.separator + "" +
                "tedu" + File.separator +
                "api" + File.separator + "io" + File.separator + "demo.txt");
        //判断文件是否存在的方法
        boolean b = file.exists();
        System.out.println("判断文件是否存在：" + b);

    }

/**
 * 查看文件或者文件夹属性信息：
 * getName()      返回值：String
 * 作用：获取文件的名字【注意：不看路径是否对错】
 * length()      返回值：long
 * 作用：返回当前文件的大小【字节量】
 * exists()   返回值：boolean
 * 作用：判断文件是否存在
 */
@Test
public void testFileGL() throws IOException {
    //创建文件夹类---路径：Maven项目--相对路径
    //相对路径：./ 当前API项目下
    File file = new File("." + File.separator + "demo.txt");
    //打印 file 的路径
    System.out.println("打印file路径: " + file.getAbsolutePath());
    //文件是否存在
    System.out.println("路径文件是否存在：" + file.exists());
    //获取文件/文件夹名字
    String name = file.getName();
    System.out.println("文件或者文件夹的名字：" + name);
    //获取文件的“大小：字节量”
    long len = file.length();
    System.out.println("获取文件大小【字节量】：" + len);
}

    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成 API 项目文件下 自动创建test.txt 文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称    ./test.txt
        File file = new File("." +
                "" + File.separator + "test.txt");
        //判断---如果文件不存在---创建
        //      如果文件存在----不创建
        if (!file.exists()) {
            System.out.println("文件夹不存在~~");
            file.createNewFile();
            System.out.println("文件已经创建~~");
        } else {
            System.out.println("文件存在，别创建了~");
        }
    }

/**
 * delete()
 * 作用：删除文件或者文件夹
 */
@Test
public void testDelete() {
    //创建File类    路径：./test.txt  ./不写代表 当前项目
    File file = new File("test.txt");
    //判断 如果文件 存在-->删除
    //            不存在-->删除
    if (file.exists()) {
        System.out.println("文件存在");
        file.delete();
        System.out.println("文件删除~");
    } else {
        System.out.println("文件已经删除~");
    }
}

    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在 API 项目下 创建一个文件夹demo
     * <p>
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     */
    @Test
    public void testMkdir() {
        //创建File文件/文件夹--->创建demo文件夹
        File file = new File("demo" +
                "" + File.separator + "abc" +
                "" + File.separator + "bcd");
        //判断 如果文件不存在---创建文件夹
        //           存在---不创建
        if (!file.exists()) {
            System.out.println("文件不存在");
            file.mkdir();
            System.out.println("创文件夹");
        } else {
            System.out.println("别再创了");
        }

    }

    /**
     * 作业1：删除多层文件夹 demo/abc/bcd 【不能使用递归】
     * 提示：构造器 new File(File parent,"子路径");
     * 不需要exists判断
     * 思路：找到每一级路径【bcd删除完毕--abc删除完毕-demo】
     */
    @Test
    public void testHomeWork1() {
        //删除多层文件夹 demo/abc/bcd
        File parent = new File("demo");
        //构造器使用(父级路径，子级路径) ： 父级路径/子级路径
        File child1 = new File(parent, "abc");
        File child2 = new File(child1, "bcd");

        child2.delete();//删除bcd
        child1.delete();//删除abc
        parent.delete();//删除demo
    }
    //作业2：FileFilter接口按照匿名内部类 方式 实现：功能是上面的需求！
    //  FileFilter ff = new FileFilter() {
    //      @Override
    //      public boolean accept(File pathname) {
    //          return false;
    //      };
    //  }


    /**
     * 访问文件夹--->所有子项【文件夹和文件】
     * listFiles()    返回值：File[]   文件数组
     * 作用：获取文件夹的所有子项【包含文件夹和文件】
     * isFile()       返回值：boolean
     * 作用：判断是否为文件，是文件true,反之
     * isDirectory   返回值：boolean
     * 作用：判断是否为文件夹，是文件夹true，反之
     * 需求：获取 API 项目下 所有的文件夹文字
     */
    @Test
    public void test () throws IOException {
        //获取 API 项目
        File file = new File("." + File.separator);
        // System.out.println(file.getCanonicalFile());
        //过滤：3个文件夹还有4个文件夹，过滤是文件夹
        if (file.isDirectory()) {
            //获取到所有文件夹
            File[] dir = file.listFiles();
            //遍历所有的文件夹名字
            for (int i = 0; i < dir.length; i++) { //i   拿到所有下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }

}